/*
 * parser.cpp
 *
 *  Created on: 11/12/2012
 *      Author: guidi
 */

#include "parser.h"
#include "const.cpp"
#include <iostream>

Parser::Parser(int argc, char** argv) {
	this->argc = argc;
	this->argv = argv;
	valido = true;
	medirTiempos = false;
	origen = "";
	destino = "";
	modo = DESCONOCIDO;
	std::string simbolo;
	for (int i = 1; i < argc && valido; i++) {
		simbolo = argv[i];
		if ((simbolo == PARAMETRO_COMPRIMIR)) {
			modo = COMPRIMIR;
			procesarModo(i);
		} else if ((simbolo == PARAMETRO_DESCOMPRIMIR)) {
			modo = DESCOMPRIMIR;
			procesarModo(i);
		} else if (simbolo == PARAMETRO_BENCHMARK) {
			medirTiempos = true;
		} else {
			std::cout << "Compresor: opción inválida -- " << simbolo
					<< std::endl;
			valido = false;
		}
	}
}

bool Parser::esValido() {
	return valido;
}

std::string Parser::getOrigen() {
	return this->origen;
}

std::string Parser::getDestino() {
	return this->destino;
}

void Parser::procesarModo(int& pos) {
	if (!modoDefinido) {
		modoDefinido = true;
		if (pos + 3 > argc) {
			valido = false;
		}
		else {
			pos++;
			origen = argv[pos];
			pos++;
			destino = argv[pos];
			valido = (validarNombre(origen) && validarNombre(destino));
		}
	}
	else {
		valido = false;
		std::cout << "Por favor, elija solo un modo de compresion" << std::endl;
	}
}

bool Parser::validarNombre(std::string uri) {
	std::string nombre;
	size_t pos = uri.find_last_of('/');
	if (pos == std::string::npos) nombre = uri;
	else {nombre = uri.substr(pos);
		nombre.erase(0,1);
	}
	return (nombre.find_first_of(CARACTERES_INVALIDOS) == std::string::npos);
}
